﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SecurityInformation.maHoa
{
    class Vigenere
    {
        private String test = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        private String plainText;
        private String cipherText;
        public String PlainText
        {
            get { return this.plainText; }
            set { this.plainText = value; }
        }
        public String CipherText
        {
            get { return this.cipherText; }
            set { this.cipherText = value; }
        }
        //kiểm tra khóa đầu vào có hợp lệ hay không
        public Boolean isValidKey(String Text,String key){return key.Length<=Text.Length;}
        //xây dựng khóa k sao cho length(k)=length(plainText)
        public String buildKey(String Text,String key)
        {
            String temp = "";
            int count = 0;
            for (int i = 0; i < Text.Length; i++)
                if (Text[i] != ' ')
                {
                    temp += key[count % key.Length];
                    count++;
                }
                else if (Text[i] == ' ')
                    temp += ' ';
         
            return temp;
        }
        //trả về index của một kí tự Pi trong bảng mã m
        public int getIndex(char key)
        {
            for (int i = 0; i < test.Length; i++)
                if (test[i] == key)
                    return i;
            return -1;
        }
        //hàm mã hóa
        public String decryption(String plainText, String key)
        {
            this.plainText = plainText.ToUpper();
            this.cipherText="";
            key=key.ToLower();
            string temp = buildKey(this.plainText, key).ToUpper();
            if (!isValidKey(this.plainText,key))
                this.cipherText = null;
            for (int i = 0; i < this.plainText.Length; i++)
            {
                if (this.plainText[i] !=' ')
                {
                    this.cipherText += test[(getIndex(this.plainText[i]) + getIndex(temp[i])) % 26];
                }
                else if (this.plainText[i] == ' ')
                {
                    this.cipherText += ' ';
                }
            }
            return this.cipherText;
        }
        //hàm giải mã
        public String encryption(String cipherText, String key)
        {
            this.cipherText = cipherText.ToUpper();
            this.plainText = "";
            string temp = buildKey(this.cipherText, key).ToUpper();
            if (!isValidKey(this.cipherText, key))
                this.cipherText = null;
            for (int i = 0; i < this.cipherText.Length; i++)
            {
                if (this.cipherText[i] != ' ')
                {
                    int t=getIndex(this.cipherText[i]) - getIndex(temp[i]);
                    t=t>0?t:t+26;
                    this.plainText += test[t% 26];
                }
                else if (this.plainText[i] == ' ')
                {
                    this.plainText += ' ';
                }
            }
            return this.plainText;
        }
    }
}
